////============================================================================
//// Name        : ArquivoParser.cpp
//// Author      : CABS
//// Version     : 0.7
//// Description : Classe para extrair links dos arquivos HTML
////               Versao inicial de teste
////============================================================================
//
//#include <iostream>
//#include <string>
//#include <fstream>
//#include <list>
//
//
//#include "../classes_net/URL.h"
//#include "../classes_logger/DebugLogger.h"
//#include "ArquivoParser.h"
//
//using namespace std;
//
//ArquivoParser::ArquivoParser(std::string _pagina_at, std::string _buffer_page){
//	fout.open("./out_logger/html_out.txt");
//	fout_links.open("./out_logger/links_out.txt");
//	fout_nolinks.open("./out_logger/nolinks_out.txt");
//	
//	if(fout == NULL || fout_links == NULL || fout_nolinks == NULL) flag_erro_file = true;
//	else flag_erro_file = false;
//	
//	s_href = "href";
//	pagina_at = _pagina_at;
//	buffer_page = _buffer_page;
//	
//	std::cout << "Paginas de: " << pagina_at << std::endl;
//}
//
////funcao para retornar erro relativo ao processamento
//int ArquivoParser::error_status(void){
//	if(flag_erro_file) return -1;
//	else               return  1;
//}
//
//
//std::list<URL> ArquivoParser::get_links(void){
//	
//	buffer_links.clear();
//	if(flag_erro_file) return buffer_urls;  // retorna elemento vazio
//		
//	unsigned int count_link = 0;	
//	
//	std::string::size_type pos_final;
//	std::string::size_type pos_atual;
//	//acha posicao final do arquivo	url_rejeita = "()'!";
//	pos_final = buffer_page.size();
//	pos_atual = buffer_page.find(s_href, 0);
//	do{
//		std::string::size_type pos_aspa_begin;
//		std::string::size_type pos_aspa_end;
//		if(pos_atual >= pos_final) continue;
//		//pega o link, se existe
//		pos_aspa_begin = buffer_page.find("\"", pos_atual);
//		pos_aspa_end = buffer_page.find("\"",pos_aspa_begin+1);
//		buffer_links.push_back(buffer_page.substr(pos_aspa_begin+1, pos_aspa_end-pos_aspa_begin-1));
//		pos_atual = buffer_page.find(s_href, pos_atual+1);
//		count_link++;
//	}while(pos_atual < pos_final);
//
//	// acabou a procura
//	std::cout << "Total de Links: " << count_link << std::endl;
//	std::cout << "Tamanho do arquivo: " << pos_final << " chars.  ";
//	std::cout << "( "<< (float) (pos_final*sizeof(char))/1024 << " Kbytes )" << std::endl;
//	
//	//Imprime buffer de links extraidos iniciais
//	int buffer_links_size = (int) buffer_links.size();
//
//	// Aplica regras para extrair falsos links
//	buffer_links = rejeita_links(buffer_links);
//	
////	//--------------------------------------------------------------------------
////	//Imprime lista de links filtrados
////	cout << endl << endl << "Parser: " << endl;
////	for(int i=0; i< buffer_links.size(); i++){
////	    cout << buffer_links.front() << endl;
////	    buffer_links.push_back(buffer_links.front()); //rotaciona
////	    buffer_links.pop_front();
////	}
//	
//	cout << "Veio até aqui... acho... " << endl;
//	buffer_urls = normalisa.normalize(buffer_links);  // canoniza URLs
//	cout << "Veio até aqui... tvz... " << endl;
//	//Imprime buffer de links extraidos final
//	buffer_links_size = (int) buffer_links.size();
//	std::cout << "Tamanho do buffer de links: " << buffer_links_size << " links" << std::endl;
//	cout << "Veio até aqui... no caso... " << endl;
//	
//	return buffer_urls;
//}
//
//
//// Referencia: http://www.ietf.org/rfc/rfc2396.txt
////             http://gbiv.com/protocols/uri/rfc/rfc3986.html
//
////   reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
////   unreserved  = alphanum | mark
////   mark        = "-" | "_" | "." | "!" | "~" | "*" | "'" | "(" | ")"
//
//// Excluidos:
////  control     = <US-ASCII coded characters 00-1F and 7F hexadecimal>
////  space       = <US-ASCII coded character 20 hexadecimal>
////  delims      = "<" | ">" | "#" | "%" | <">
////  unwise      = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`""
//		
//
//std::list <std::string> ArquivoParser::rejeita_links(std::list <std::string> lista_in){
//
//	std::string temp_url;
//	int buffer_links_size = (int) lista_in.size();
//	
//	try{
//	
//	url_rejeita = "()'!@{}|\\^[]`<>";
//
//	//referencia para links relativos
//	uint pos_barra = pagina_at.find_last_of("/"); 
//	if( pos_barra != std::string::npos) pagina_at.erase(pos_barra);
//	
//	//Grava em arquivo a lista
//	for( int i=0; i<buffer_links_size; i++){
//		temp_url = lista_in.front();
//
//		if( temp_url.find_first_of(url_rejeita) == std::string::npos
//			&& temp_url.find_first_of("./") != std::string::npos ){
//			
//				// Tira carecteres indesejados
//				for(unsigned int t=0; t < temp_url.size(); t++)
//					if(temp_url.at(t) == ' ' || temp_url.at(t) == '\n'){
//						temp_url.erase(t,1); // tira caractere
//						t--;           // volta uma pos.
//					}
//				
//				//resolve links relativos
//				if(temp_url.at(0) == '/' || temp_url.at(0) == '.'){
//					for(uint t=0; t<=temp_url.size(); t++)
//						if(temp_url.at(0) == '/' || temp_url.at(0) == '.'){
//							if(temp_url.at(0) == '.' && temp_url.at(1) == '.'){
//								temp_url.erase(0,2);
//								pos_barra = pagina_at.find_last_of("/"); 
//								if( pos_barra != std::string::npos){
//									if( pagina_at.find_last_of("/") > pagina_at.find_last_of(".")  
//										&& pagina_at.find_last_of("/") != std::string::npos
//										&& pagina_at.find_last_of("/") != std::string::npos) pagina_at.erase(pos_barra); //retorna dir se puder
//								}
//							}
//							temp_url.erase(0,1);
//							if(temp_url.find_first_of("./") == std::string::npos){
//								temp_url = pagina_at + '/' + temp_url; 
//								break;
//							}
//						}else{
//							temp_url = pagina_at + '/' + temp_url;
//							break;
//						}
//				}else if(   temp_url.find("://") == std::string::npos &&
//						  ( temp_url.find_first_of("/") < temp_url.find_first_of(".") ||
//						    temp_url.find_first_of("/") == std::string::npos )){
//					temp_url = pagina_at + '/' + temp_url;
//				}
//				fout_links << temp_url << std::endl;
//				lista_in.push_back(temp_url);
//				lista_in.pop_front();
//				
//		}else{
//			fout_nolinks << temp_url << std::endl;
//			lista_in.pop_front();
//		}
//		
//	}
//	
//	}catch(...){ // Gambi
////		DebugLogger dbug_rejeita_links("dbug_rejeita_links");
////		dbug_rejeita_links.enable(DebugLogger::info + DebugLogger::alert + DebugLogger::error);
////		dbug_rejeita_links.errorMsg(lista_in.front());
//	}
//	return lista_in;
//}
